package com.wonders.bigdata.nio;

import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

/**
 * Description: MappedByteBuffer可以让文件直接在内存（堆外的内存）中进行修改，操作系统不需要copy一次
 * 同步到文件由NIO来完成<br>
 *
 * @author: XB
 * @date: 2021/5/8 14:22
 */
public class MappedByteBufferTest {
    public static void main(String[] args) throws Exception {
        RandomAccessFile randomAccessFile = new RandomAccessFile("/file/netty/file01.txt", "rw");
        // 获取对应的通道
        FileChannel fileChannel = randomAccessFile.getChannel();

        /**
         * 参数1：FileChannel.MapMode.READ_WRITE 使用的读写模式
         * 参数2：0 可以直接修改的起始位置
         * 参数3:5 是映射到内存的大小（不是索引位置），即将目标文件的多少个字节映射到内存
         * 可以直接修改的范围就是0-5
         * 实际类型 DirectByteBuffer
         */
        MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5);

        mappedByteBuffer.put(0, (byte) 'O');
        mappedByteBuffer.put(3, (byte) '9');

        randomAccessFile.close();
        fileChannel.close();
        System.out.println("修改成功");
    }
}
